package com.xinyue.ext;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.xinyue.ext.data.EntityData;

import freemarker.template.Configuration;

/**
 * 根据配置文件自动生成JavaBean以及DAO层的接口和实现类
 */
@SuppressWarnings("unchecked")
public class AutoBuild implements Label{
	//項目根路径
	private static final String root = System.getProperty("user.dir");
	//XML文件路径
	private static final String xml = root + "/builder/build-config.xml";
	//模板文件夹路径
	private static String tempRoot;
	//生成目标文件夹路径
	private static String autoRoot;
	//buildMapping映射文件路径
	private static String buildRoot;
	//sql文件夹路径
	private static String sqlRoot;
	//buildMapping映射文件路径
	private static List<String> buildMapping = new ArrayList<String>();
	
	/**
	 * 入口方法
	 * 读取配置文件
	 * 根据配置文件信息调用freeMarker的模板
	 * 创建符合HIBERNATE规范的Java对象和DAO对象
	 */
	public static void main(String[] args) throws Exception {
		//1_读取配置文件并返回数据
		XmlReader xmlReader = new XmlReader();
		List<EntityData> entites = xmlReader.readXml(buildMapping);
		
		//2_配置调用freeMarker
		Configuration cfg = new Configuration();
		cfg.setDefaultEncoding("UTF-8");//设置默认编码
		cfg.setDirectoryForTemplateLoading(new File(tempRoot));//设置读取模板文件的目录
		
		//3_创建freemarker数据模型并生成代码文件
		CodeBuilder code = new CodeBuilder(autoRoot);
		code.buildCodeFile(cfg, entites);
		
		//4_创建sql语句
		SqlBuilder sql = new SqlBuilder(sqlRoot);
		sql.crateSql(entites);
	}
	
	/**
	 * 初始化自动构建
	 * 读取配置文件信息
	 * @throws Exception
	 */
	static {
		try {
			SAXReader reader = new SAXReader();
			Document document = reader.read(new File(xml));
			
			//根节点
			Element rootNode = document.getRootElement();
			//读取模板文件夹路径
			tempRoot = root + rootNode.element(tempRoot_).attributeValue(path_);
			//读取生成目标文件夹路径
			autoRoot = root + rootNode.element(autoRoot_).attributeValue(path_);
			//读取buildMapping映射文件夹路径
			buildRoot = root + rootNode.element(buildRoot_).attributeValue(path_);
			//读取sql文件夹路径
			sqlRoot = root + rootNode.element(sqlRoot_).attributeValue(path_);
			
			//读取映射文件
			List<Element> imports = rootNode.elements(import_);
			if(imports != null && imports.size() > 0) {
				for (Element e: imports) {
					//加载没有锁定的import文件
					if("false".equals(e.attributeValue(locked_))) {
						if("false".equals(e.attributeValue(userBase_))) {
							buildMapping.add(e.attributeValue(path_));
						}else {
							buildMapping.add(buildRoot + e.attributeValue(path_));
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
